package com.gl.saasservice.oss.service;

import java.io.*;
import java.util.Date;
import java.util.List;

import com.gl.framework.web.response.Result;
import com.gl.saasservice.oss.config.OssConfig;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;


/**
 * 阿里云OSS对象存储
 *
 * @author shun
 * @createDate: 2021年3月23日 下午2:49:08
 * @version: 1.0
 */
@Service
public class OSSService {
    private Logger LOG = LoggerFactory.getLogger(OSSService.class);
    @Autowired
    private OSSClient ossClient;
    @Autowired
    private OssConfig ossConfig;

    /**
     * 上传文件
     *
     * @param bucketName oss桶名称
     * @param mfile      文件
     * @param type       文件业务类型
     * @return 文件key
     * @author shun
     * @date 2021年3月24日
     */
    public Result putFile(String bucketName, MultipartFile mfile, String type) {
        if (StringUtils.isEmpty(bucketName)) {
            bucketName = ossConfig.getOssBucketName();
        }

        //File temp = new File("temp_" + getNewName(mfile.getOriginalFilename()));
        StringBuilder fileKey = new StringBuilder();
        fileKey.append(type);
        fileKey.append("/").append(getNewName(mfile.getOriginalFilename()));
        //try (FileOutputStream fos = new FileOutputStream(temp);
        //		BufferedOutputStream bos = new BufferedOutputStream(fos)) {
        //	//bos.write(mfile.getBytes());
        //	bos.flush();
        //	bos.close();
        //	fos.close();
        //	// 上传
        //	ossClient.putObject(bucketName, fileKey.toString(), mfile.getInputStream());
        //	temp.delete();
        //	return Result.success(fileKey.toString());
        //} catch (Exception e) {
        //	LOG.error(e.getMessage(), e);
        //	return Result.fail(e.getMessage());
        //}
        try {
            ossClient.putObject(bucketName, fileKey.toString(), mfile.getInputStream());
        } catch (IOException e) {
            LOG.error(e.getMessage(), e);
            return Result.fail(e.getMessage());
        }
        return Result.success(fileKey.toString());
    }

    /**
     * 上传文件
     *
     * @param bucketName oss桶名称
     * @param file       文件
     * @param type       文件业务类型
     * @return 文件key
     * @author shun
     * @date 2021年3月24日
     */
    public String putFile(String bucketName, File file, String type) {
        try {
            StringBuilder fileKey = new StringBuilder();
            fileKey.append(type);
            fileKey.append("/").append(getNewName(file.getName()));
            // 上传
            ossClient.putObject(bucketName, fileKey.toString(), file);
            return fileKey.toString();
        } catch (Exception e) {
            LOG.info(e.getMessage(), e);
        }
        return null;
    }

    /**
     * 返回文件访问全路径
     *
     * @param fileKey
     * @return
     * @author shun
     * @date 2021年3月24日
     */
    public String getOssFilePath(String fileKey) {
        return ossConfig.getBucketUrl() + fileKey;
    }

    /**
     * 单文件删除
     *
     * @param bucketName 对象存储桶名称
     * @author shun
     * @date 2020年12月30日
     */
    public Result deleteObject(String bucketName, String fileKey) {

        if (StringUtils.isEmpty(bucketName)) {
            bucketName = ossConfig.getOssBucketName();
        }
        try {
            ossClient.deleteObject(bucketName, fileKey);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            return Result.fail(e.getMessage());
        }


        return Result.success(null);
    }

    /**
     * 批量删除桶内所有对象
     *
     * @param bucketName
     * @param keys       删除文件。key等同于ObjectName，表示删除OSS文件时需要指定包含文件后缀在内的完整路径，例如abc/efg/
     *                   123.jpg
     * @return
     * @author shun
     * @date 2021年3月23日
     */
    public List<String> batchDeleteObject(String bucketName, List<String> keys) {
        DeleteObjectsResult deleteObjectsResult = ossClient
                .deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
        return deleteObjectsResult.getDeletedObjects();
    }

    private String getNewName(String filename) {
        int indx = filename.lastIndexOf(".");
        String suffix = filename.substring(indx, filename.length());
        return (getDate() + System.currentTimeMillis() + suffix);
    }

    private String getDate() {
        return DateFormatUtils.format(new Date(), "yyyyMMdd");
    }
}
